c写个linux的小程序,从bin文件中读取数据,打印结构体中的成员变量。

最近实习接触到一个任务,这个任务的需求是:

 

写个linux的小程序,当输入参数-t时,打印当前时间;当输入参数-f时,则打印出头文件中的所有结构体。

 

我手中有的材料是:

一个头文件,头文件中定义了很多结构体,结构体中还有结构体变量,总共三层。

 

刚开始接触到这个任务的时候,一头雾水,本身c语言就不熟,更何况在linux下编程,非常慌张。上网很久,也在CSDN和百度上发了求助帖,浪费了很多积分,最后也没有获得什么满意的答复。但是这个学习和搜索的过程也是非常幸福的。查了很多资料后,才渐渐有了思路。我想了想这个问题可以分为三个小部分。

 

1、当输入参数-t, -f时。。。。这个条件如何控制?

2、bin文件中的数据和头文件中的结构体变量时怎样关联的?我怎么利用bin文件的数据对头文件中的结构体成员变量进行初始化?

3、完成初始化工作后,我怎么将结构体中的数据进行打印?

 

由于公司保密原因,所以只贴出部分代码。通过下面的步骤就已经对大的结构体A进行了初始化了。

FILE *file;
A *p1=new A;
int sizeread=sizeof(_ASA_TEST_PACKAGE);
int buf[250];
fopen_s(&file,"core_pass2.txt","rb");    //以二进制的方式打开文件
if (file==NULL)
{
printf( "The file was not opened\n" );
}
fread(buf,1,sizeread,file);
p1=(A*)buf;

至于打印,贴出一个函数,这个函数的使用非常方便,只需要传入要打印结构体的结构体指针和结构体大小,就可以进行打印,且可以控制一行打印的字节数和字节与字节之间是否需要留一个空格。

void print_struct_content(void *strp, size_t size)
{
size_t i;
char *printbit=(char *)strp;
int formatter=0;
for (i=0; i<size; i++)
{
printf("%02X",printbit[i]&0XFF);
formatter++;
if ((formatter%4)==0)
{
printf("\n");
}
}
}

我想重要的两个地方的代码我都贴了出来,大家可以借鉴借鉴,以免多走弯路。欢迎留言交流。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果要从文件结尾向前读取不知道大小的结构体的变量,我们可以按照以下步骤进行: 1. 打开二进制文件: 使用C语言的`fopen`函数打开文件,并以二进制模式打开(`rb`)。 2. 定位到文件末尾: 使用`fseek`函数将文件指针定位到文件末尾。 3. 逐步向前读取数据: 从文件末尾开始,使用`fread`函数逐步读取数据,并将其存储到一个缓冲区。 4. 解析结构体变量: 通过解析缓冲区数据获取结构体的变量。这需要根据结构体的定义和存储方式进行解析操作。 以下是一个示例代码,演示了如何实现上述步骤: ```c #include <stdio.h> #include <stdlib.h> typedef struct { // 定义结构体成员 int variable; } MyStruct; int main() { FILE *file = fopen("binary_file.bin", "rb"); // 打开二进制文件 if (file == NULL) { printf("无法打开文件\n"); return 1; } fseek(file, 0, SEEK_END); // 将文件指针定位到文件末尾 long fileSize = ftell(file); // 获取文件大小 long structSize = sizeof(MyStruct); // 获取结构体的大小 long numStructs = fileSize / structSize; // 计算结构体的数量 // 创建一个缓冲区,用于存储读取的数据 char *buffer = (char *)malloc(structSize * numStructs); if (buffer == NULL) { printf("内存分配失败\n"); return 1; } fseek(file, -structSize * numStructs, SEEK_END); // 将文件指针定位到最后一个结构体的位置 fread(buffer, structSize, numStructs, file); // 读取数据到缓冲区 // 解析结构体变量 for (int i = 0; i < numStructs; i++) { MyStruct *structPtr = (MyStruct *)(buffer + structSize * i); printf("第 %d 个结构体的变量值为: %d\n", i + 1, structPtr->variable); } free(buffer); // 释放缓冲区内存 fclose(file); // 关闭文件 return 0; } ``` 请注意,以上示例代码仅为演示目的,实际使用时应进行错误处理和适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值